package br.com.caelum.vraptor.casehd;

import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.view.Results;
import dao.UsuarioDao;
import dao.UsuarioDuplicadoException;
import java.sql.SQLException;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import model.Usuario;
import model.UsuarioLogado;

@Resource
public class UsuarioController {

    private final Result result;
    private final UsuarioLogado usuarioLogado;

    public UsuarioController(Result result, UsuarioLogado usuarioLogado) {
        this.result = result;
        this.usuarioLogado = usuarioLogado;
    }

    @Path("/usuario")
    public void index() {
        UsuarioDao usuarioDao = new UsuarioDao();
        try {
            List lista = usuarioDao.lista();
            result.include("lista", lista);
            result.include("linhas", lista.size());
        } catch (SQLException ex) {
            Logger.getLogger(UsuarioController.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Path("/usuario/logout")
    public void logout() {        
        usuarioLogado.setUser(null);
        result.use(Results.logic()).redirectTo(IndexController.class).index();
    }

    @Path("/usuario/salvar/voltar")
    public void voltar() {
        result.use(Results.logic()).redirectTo(IndexController.class).index();
    }

    @Path("/usuario/salvar")
    @Post
    public void salvar(Usuario usuario) {
        UsuarioDao usuarioDao = new UsuarioDao();
        try {
            usuarioDao.insere(usuario);
            result.include("msg", usuario);
        } catch (UsuarioDuplicadoException ex) {
            result.include("msg", ex.getMessage());
            result.use(Results.logic()).redirectTo(UsuarioController.class).index();
            Logger.getLogger(UsuarioController.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            Logger.getLogger(UsuarioController.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Path("/usuario/login")
    @Post
    public void login(Usuario usuario) {
        UsuarioDao usuarioDao = new UsuarioDao();

        try {
            Usuario userLogin = new Usuario();
            userLogin = usuarioDao.login(usuario);
            if (userLogin != null) {
                usuarioLogado.setUser(userLogin);
                result.include("msg", "Bem Vindo " + userLogin.getNome());
                result.use(Results.logic()).redirectTo(IndexController.class).index();
            } else {
                result.include("msg", "Usuário/Senha inválido.");
                result.use(Results.logic()).redirectTo(IndexController.class).index();
            }

        } catch (SQLException ex) {
            Logger.getLogger(UsuarioController.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
